<?php
/**
 * Bootstrap file for setting the ABSPATH constant
 * and loading the wp-config.php file. The wp-config.php
 * file will then load the wp-settings.php file, which
 * will then set up the WordPress environment.
 *
 * If the wp-config.php file is not found then an error
 * will be displayed asking the visitor to set up the
 * wp-config.php file.
 *
 * Will also search for wp-config.php in WordPress' parent
 * directory to allow the WordPress directory to remain
 * untouched.
 *
 * @internal This file must be parsable by PHP4.
 *
 * @package WordPress
 */
 
/*
 * 这是wordpress的初始化文件，在众多文件中被包含
 * 它自己上面的英文注释已经写了，它会定义ABSPATH这个广泛使用的全局变量，然后加载wp-config.php，然后
 * 在wp-config.php中加载wp-settings.php。其中，wp-config.php是用户安装配置文件。
 * 这里它有一个值得一提的机制，就是
 * 它会在wordpress目录以及wordpress的上级目录中查找wp-config.php，因为这样可以允许用户将配置文件
 * 放在上级目录下，从而可以让wordpress自己的目录保持一点都没有被改动（升级什么的都方便）
 */
 
/*
 * 关于路径定义我有话说，就是在定义的时候要么结尾全部包含“／”符号，要么全部不包含，要统一原则
 */
/** Define ABSPATH as this file's directory */
define( 'ABSPATH', dirname(__FILE__) . '/' );

/*
 * 它这里明确定义了报告哪些错误。和我们一般的习惯不一样，我们一般都是先E_ALL，然后从中排除某些类型，比如
 * E_ALL ^ ~E_NOTICE
 * 它这个做法我觉得有一个好处，就是当php版本升级时，如果出现一些新的错误类型，用它这种方法就可以忽略掉了，
 * 比如php5.3中增加的E_DEPRECATED类型，我们自己的系统就会出现这个提示，而wordpress就没有这个问题，可
 * 以认为兼容性更好一些
 */
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );

/*
 * 开始在wordpress根目录和wordpress上一级目录中查找并加载wp-config.php
 */
if ( file_exists( ABSPATH . 'wp-config.php') ) {

	/** The config file resides in ABSPATH */
	require_once( ABSPATH . 'wp-config.php' );

}
/*
 * 用dirname(ABSPATH)来取上一级目录，比我惯用的ABSPATH . '../wp-config.php'看上去更优雅一些
 * 这里它还检查了上一级目录中有没有wp-settings.php这个文件，这样可以避免如果我在wordpress的某个
 * 子目录中又安装了一个wordpress这种情况下会产生的配置文件误用的问题
 */
 elseif ( file_exists( dirname(ABSPATH) . '/wp-config.php' ) && ! file_exists( dirname(ABSPATH) . '/wp-settings.php' ) ) {

	/** The config file resides one level above ABSPATH but is not part of another install */
	require_once( dirname(ABSPATH) . '/wp-config.php' );

} else {
/*
 * 没有配置文件，就给出配置提示，这里它做了一个系统的简单的初始化，然后打印出一个提示界面
 */
	// A config file doesn't exist

	// Set a path for the link to the installer
	if ( strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false )
		$path = 'setup-config.php';
	else
		$path = 'wp-admin/setup-config.php';

	define( 'WPINC', 'wp-includes' );
	define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
	require_once( ABSPATH . WPINC . '/load.php' );
	require_once( ABSPATH . WPINC . '/version.php' );

	wp_load_translations_early();
	wp_check_php_mysql_versions();

	/*
	 * 下面频繁用到的__()函数是wordpress的多语言支持的翻译函数，在l10n.php中定义。
	 * 之所以用"__"作为函数名，大概是因为php的gettext扩展已经有了一个_函数，而它为了保持该函数的使用简便就多加了一个"_"
	 */
	// Die with an error message
	$die  = __( "There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started." ) . '</p>';
	$die .= '<p>' . __( "Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>." ) . '</p>';
	$die .= '<p>' . __( "You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file." ) . '</p>';
	$die .= '<p><a href="' . $path . '" class="button">' . __( "Create a Configuration File" ) . '</a>';

	wp_die( $die, __( 'WordPress &rsaquo; Error' ) );
}
